home *** CD-ROM | disk | FTP | other *** search
/ Zoom 2 / Zoom - Release 2 (1996)(Active Software)[!].iso / graphics / misc / opticon18 / icon2c.c < prev    next >
C/C++ Source or Header  |  1978-06-28  |  47KB  |  1,171 lines

  1. /*
  2.  *  ICON2C.C
  3.  */
  4.  
  5. #define VERSION "1.1"
  6. static char versiontag[]= "$VER: $Id: icon2c.c,v 1.3 1994/07/17 22:41:02 tf Exp $";
  7.  
  8. /****** Icon2C ******************************************
  9. *
  10. *   NAME
  11. *    Icon2C -- Generate C sourcecode from an icon image (V36)
  12. *
  13. *   SYNOPSIS
  14. *    Icon2C NAME/A,QUIET/S,TO/K
  15. *
  16. *   FUNCTION
  17. *    Icon2C reads in given ".info" file and writes out well documented
  18. *    and directly compilable C code.  This code if compiled with a symbol
  19. *    TEST defined (usual compiler option: -DTEST) will generate an
  20. *    executable which writes back the icon image file to disk.  This
  21. *    allows you to modify any icon image to your own needs.
  22. *
  23. *   INPUTS
  24. *    NAME          - name of the icon image file.  A trailing ".info"
  25. *            is optional but not required.
  26. *    QUIET         - If this switch is set then Icon2C will not print any
  27. *            warnings.
  28. *    TO            - specifies the output file.  If not specified the
  29. *            standard output stream will be used.
  30. *
  31. *   EXAMPLE
  32. *    ;generate C code for the disk icon of the disk in DF0:
  33. *    icon2c df0:disk quiet to ram:diskicon.c
  34. *
  35. *   DISCLAIMER
  36. *    This file is part of the Icon2C and OptIcon distribution.
  37. *
  38. *    Icon2C and OptIcon are free software; you can redistribute them
  39. *    and/or modify them under the terms of the GNU General Public License
  40. *    as published by the Free Software Foundation; either version 1 of
  41. *    the License, or (at your option) any later version.
  42. *
  43. *    Icon2C and Opticon are distributed in the hope that they will be
  44. *    useful, but WITHOUT ANY WARRANTY; without even the implied warranty
  45. *    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  46. *    GNU General Public License for more details.
  47. *
  48. *    You should have received a copy of the GNU General Public License
  49. *    along with these programs; see the file COPYING.  If not, write to
  50. *    the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  51. *
  52. *   COPYRIGHT
  53. *    Icon2C and OptIcon are Copyright (C)1994 by Tobias Ferber.
  54. *    You can reach me via E-mail: ukjg@rz.uni-karlsruhe.de
  55. *
  56. *   SEE ALSO
  57. *    PatchIcons, OptIcon
  58. *
  59. ******************************************************************************
  60. *
  61. *    Compile w/ -DDEBUG to output more information at runtime
  62. */
  63.  
  64. #include <intuition/intuition.h>
  65. #include <intuition/intuitionbase.h>
  66.  
  67. #include <workbench/workbench.h>
  68. #include <workbench/icon.h>
  69.  
  70. #include <dos/dos.h>
  71. #include <dos/rdargs.h>
  72.  
  73. #include <stdarg.h>
  74. #include <stdlib.h>
  75. #include <string.h>
  76. #include <stdio.h>
  77.  
  78. #ifdef __GNUC__
  79. /* suggest parentheses around assignment used as truth value */
  80. #define if(assignment) if( (assignment) )
  81. #endif /* __GNUC__ */
  82.  
  83. extern struct Library *OpenLibrary(STRPTR, ULONG);
  84. extern void CloseLibrary(struct Library *);
  85. extern struct RDArgs *ReadArgs(STRPTR, LONG *, struct RDArgs *);
  86. extern LONG IoErr(void);
  87. extern BOOL PrintFault(LONG, STRPTR);
  88. extern void FreeArgs(struct RDArgs *);
  89. extern struct DiskObject *GetDiskObject(char *);
  90. extern void FreeDiskObject(struct DiskObject *);
  91.  
  92. struct IconBase *IconBase;
  93.  
  94. char *whoami, *iname;  /* argv[0], icon filename w/o ".info" */
  95. int quiet= 0;
  96. FILE *fout;
  97.  
  98.  
  99. void pout(const char *fmt, ...)
  100. {
  101.   va_list argp;
  102.   va_start(argp,fmt);
  103.   vfprintf(fout,fmt,argp);
  104.   va_end(argp);
  105. }
  106.  
  107.  
  108. void warn(const char *fmt, ...)
  109. {
  110.   if(!quiet)
  111.   {
  112.     va_list argp;
  113.     va_start(argp,fmt);
  114.     fprintf(stderr,"%s: %s.info: ",whoami, iname);
  115.     vfprintf(stderr,(char *)fmt,argp);
  116.     fprintf(stderr,"\n");
  117.     fflush(stderr);
  118.     va_end(argp);
  119.   }
  120. }
  121.  
  122.  
  123. void display_version_information(void)
  124. {
  125.   static char license[]=
  126.     "Icon2C is free software; you can redistribute it and/or modify\n"
  127.     "it under the terms of the GNU General Public License as published\n"
  128.     "by the Free Software Foundation; either version 1 of the License,\n"
  129.     "or (at your option) any later version.\n"
  130.     "\n"
  131.     "Icon2C is distributed in the hope that it will be useful,\n"
  132.     "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
  133.     "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
  134.     "GNU General Public License for more details.\n"
  135.     "\n"
  136.     "You should have received a copy of the GNU General Public License\n"
  137.     "along with Icon2C; see the file COPYING.  If not, write to the\n"
  138.     "Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n"
  139.     ;
  140.  
  141.   puts("Icon2C Version " VERSION " (compiled " __DATE__ ", " __TIME__ ")\n"
  142.        "(c)Copyright 1994 by Tobias Ferber, ukjg@rz.uni-karlsruhe.de\n");
  143.  
  144.   puts(license);
  145. }
  146.  
  147.  
  148. #define oops(field,value)  warn("unexpected value 0x%lx for %s",value,field)
  149.  
  150. #define DISKOBJECT_NAME    "icon"
  151. #define GADGETRENDER_NAME  "gr"
  152. #define SELECTRENDER_NAME  "sr"
  153. #define GADGET_NAME        "g"
  154. #define TTARRAY_NAME       "tt"  /* ToolTypes array */
  155. #define DRAWERDATA_NAME    "dd"
  156.  
  157. #define BEGIN_CODE(s)      pout(                                                  \
  158.                              "/*\n *  code generated from \"%s.info\"\n */\n\n"    \
  159.                              "#include <intuition/intuition.h>\n"                 \
  160.                              "#include <workbench/workbench.h>\n"                 \
  161.                              "#include <workbench/icon.h>\n\n"                    \
  162.                            ,s)
  163.  
  164. #define END_CODE           pout(                                                                     \
  165.                              "\n\n#ifdef TEST\n"                                                     \
  166.                              "#include <intuition/intuitionbase.h>\n"                                \
  167.                              "#include <stdlib.h>\n"                                                 \
  168.                              "#include <stdio.h>\n\n"                                                \
  169.                              "extern struct Library *OpenLibrary(STRPTR, ULONG);\n"                  \
  170.                              "extern void CloseLibrary(struct Library *);\n"                         \
  171.                              "extern LONG IoErr(void);\n"                                            \
  172.                              "extern BOOL PrintFault(LONG, STRPTR);\n"                               \
  173.                              "extern BOOL PutDiskObject(char *, struct DiskObject *);\n\n"           \
  174.                              "struct IconBase *IconBase;\n\n"                                        \
  175.                              "main(int argc, char **argv)\n{\n"                                      \
  176.                              "  if(argc == 2)\n"                                                     \
  177.                              "  {\n"                                                                 \
  178.                              "    if( (IconBase= (struct IconBase *)OpenLibrary(ICONNAME,36)) )\n"   \
  179.                              "    {\n"                                                               \
  180.                              "      if( !PutDiskObject(argv[1],&icon) )\n"                           \
  181.                              "        PrintFault(IoErr(),argv[1]);\n"                                \
  182.                              "      CloseLibrary(IconBase);\n"                                       \
  183.                              "    }\n"                                                               \
  184.                              "    else printf(\"%%s: no %%s.\\n\",*argv,ICONNAME);\n"                \
  185.                              "  }\n"                                                                 \
  186.                              "  else printf(\"usage: %%s <filename>\\n\",*argv);\n"                  \
  187.                              "  exit( IoErr() );\n"                                                  \
  188.                              "}\n"                                                                   \
  189.                              "#endif /* TEST */\n"                                                   \
  190.                            )
  191.  
  192. #define BEGIN_STRUCT(s,n)  pout("\nstruct %s %s = {\n",s,n)
  193. #define END_STRUCT         pout("};\n")
  194. #define BEGIN_FIELD        pout("\t")
  195. #define P_CONST(s)         pout("%s",s)
  196. #define P_NUMVAL(n)        pout("%ld",n)
  197. #define P_HEXVAL(x)        pout("0x%lx",x)
  198. #define P_STRVAL(s)        if(s) { pout("\""); if(*s) pout("%s",s); pout("\""); } else pout("NULL")
  199. #define END_FIELD(f)       if(f && *f) pout(",\t/* %s */\n",f); else pout(",\n")
  200.  
  201.  
  202. #ifdef DEBUG
  203.  
  204. void p_strN(int n, char *s)
  205. {
  206.   if(s)
  207.   { putchar('\"');
  208.     while(*s && 0<n--) putchar(*s++);
  209.     putchar('\"');
  210.   }
  211.   else pout("NULL");
  212. }
  213.  
  214.  
  215. void p_Gadget(struct Gadget *g, char *name)
  216. {
  217.   pout("\n#ifdef UNDEFINED\n");
  218.  
  219.   BEGIN_STRUCT( ((g->Flags & GFLG_EXTENDED) ? "ExtGadget" : "Gadget"), name);
  220.  
  221.     BEGIN_FIELD;
  222.       P_CONST("NULL");
  223.       if(g->NextGadget)
  224.         pout(" /* 0x%lx */",g->NextGadget);
  225.     END_FIELD("NextGadget");
  226.  
  227.     BEGIN_FIELD;
  228.       P_NUMVAL(g->LeftEdge);
  229.     END_FIELD("LeftEdge");
  230.  
  231.     BEGIN_FIELD;
  232.       P_NUMVAL(g->TopEdge);
  233.     END_FIELD("TopEdge");
  234.  
  235.     BEGIN_FIELD;
  236.       P_NUMVAL(g->Width);
  237.     END_FIELD("Width");
  238.  
  239.     BEGIN_FIELD;
  240.       P_NUMVAL(g->Height);
  241.     END_FIELD("Height");
  242.  
  243.     BEGIN_FIELD;
  244.     {
  245.       UWORD f= g->Flags;
  246.  
  247.       if(f)
  248.       {
  249.         /* <workbench/workbench.h> */
  250.         if(f & GADGBACKFILL)      { P_CONST("GADGBACKFILL");      f &= ~GADGBACKFILL;      if(f) P_CONST("|"); }
  251.         /* <intuition/intuition.h> */
  252.         /*if(f & GFLG_GADGHIGHBITS) { P_CONST("GFLG_GADGHIGHBITS"); f &= ~GFLG_GADGHIGHBITS; if(f) P_CONST("|"); }*/
  253.         if(f & GFLG_GADGHCOMP)    { P_CONST("GFLG_GADGHCOMP");    f &= ~GFLG_GADGHCOMP;    if(f) P_CONST("|"); }
  254.         if(f & GFLG_GADGHBOX)     { P_CONST("GFLG_GADGHBOX");     f &= ~GFLG_GADGHBOX;     if(f) P_CONST("|"); }
  255.         if(f & GFLG_GADGHIMAGE)   { P_CONST("GFLG_GADGHIMAGE");   f &= ~GFLG_GADGHIMAGE;   if(f) P_CONST("|"); }
  256.         if(f & GFLG_GADGHNONE)    { P_CONST("GFLG_GADGHNONE");    f &= ~GFLG_GADGHNONE;    if(f) P_CONST("|"); }
  257.         if(f & GFLG_GADGIMAGE)    { P_CONST("GFLG_GADGIMAGE");    f &= ~GFLG_GADGIMAGE;    if(f) P_CONST("|"); }
  258.         if(f & GFLG_RELBOTTOM)    { P_CONST("GFLG_RELBOTTOM");    f &= ~GFLG_RELBOTTOM;    if(f) P_CONST("|"); }
  259.         if(f & GFLG_RELRIGHT)     { P_CONST("GFLG_RELRIGHT");     f &= ~GFLG_RELRIGHT;     if(f) P_CONST("|"); }
  260.         if(f & GFLG_RELWIDTH)     { P_CONST("GFLG_RELWIDTH");     f &= ~GFLG_RELWIDTH;     if(f) P_CONST("|"); }
  261.         if(f & GFLG_RELHEIGHT)    { P_CONST("GFLG_RELHEIGHT");    f &= ~GFLG_RELHEIGHT;    if(f) P_CONST("|"); }
  262.         if(f & GFLG_RELSPECIAL)   { P_CONST("GFLG_RELSPECIAL");   f &= ~GFLG_RELSPECIAL;   if(f) P_CONST("|"); }
  263.         if(f & GFLG_SELECTED)     { P_CONST("GFLG_SELECTED");     f &= ~GFLG_SELECTED;     if(f) P_CONST("|"); }
  264.         if(f & GFLG_DISABLED)     { P_CONST("GFLG_DISABLED");     f &= ~GFLG_DISABLED;     if(f) P_CONST("|"); }
  265.         if(f & GFLG_LABELMASK)    { P_CONST("GFLG_LABELMASK");    f &= ~GFLG_LABELMASK;    if(f) P_CONST("|"); }
  266.         if(f & GFLG_LABELITEXT)   { P_CONST("GFLG_LABELITEXT");   f &= ~GFLG_LABELITEXT;   if(f) P_CONST("|"); }
  267.         if(f & GFLG_LABELSTRING)  { P_CONST("GFLG_LABELSTRING");  f &= ~GFLG_LABELSTRING;  if(f) P_CONST("|"); }
  268.         if(f & GFLG_LABELIMAGE)   { P_CONST("GFLG_LABELIMAGE");   f &= ~GFLG_LABELIMAGE;   if(f) P_CONST("|"); }
  269.         if(f & GFLG_TABCYCLE)     { P_CONST("GFLG_TABCYCLE");     f &= ~GFLG_TABCYCLE;     if(f) P_CONST("|"); }
  270.         if(f & GFLG_STRINGEXTEND) { P_CONST("GFLG_STRINGEXTEND"); f &= ~GFLG_STRINGEXTEND; if(f) P_CONST("|"); }
  271.         if(f & GFLG_IMAGEDISABLE) { P_CONST("GFLG_IMAGEDISABLE"); f &= ~GFLG_IMAGEDISABLE; if(f) P_CONST("|"); }
  272.         if(f & GFLG_EXTENDED)     { P_CONST("GFLG_EXTENDED");     f &= ~GFLG_EXTENDED;     if(f) P_CONST("|"); }
  273.         if(f) P_NUMVAL(f);
  274.       }
  275.       else P_CONST("NULL");
  276.     }
  277.     END_FIELD("Flags");
  278.  
  279.     BEGIN_FIELD;
  280.     {
  281.       UWORD a= g->Activation;
  282.  
  283.       if(a)
  284.       {
  285.         if(a & GFLG_LABELITEXT)   { P_CONST("GFLG_LABELITEXT");   a &= ~GFLG_LABELITEXT;   if(a) P_CONST("|"); }
  286.         if(a & GACT_RELVERIFY)    { P_CONST("GACT_RELVERIFY");    a &= ~GACT_RELVERIFY;    if(a) P_CONST("|"); }
  287.         if(a & GACT_IMMEDIATE)    { P_CONST("GACT_IMMEDIATE");    a &= ~GACT_IMMEDIATE;    if(a) P_CONST("|"); }
  288.         if(a & GACT_ENDGADGET)    { P_CONST("GACT_ENDGADGET");    a &= ~GACT_ENDGADGET;    if(a) P_CONST("|"); }
  289.         if(a & GACT_FOLLOWMOUSE)  { P_CONST("GACT_FOLLOWMOUSE");  a &= ~GACT_FOLLOWMOUSE;  if(a) P_CONST("|"); }
  290.         if(a & GACT_RIGHTBORDER)  { P_CONST("GACT_RIGHTBORDER");  a &= ~GACT_RIGHTBORDER;  if(a) P_CONST("|"); }
  291.         if(a & GACT_LEFTBORDER)   { P_CONST("GACT_LEFTBORDER");   a &= ~GACT_LEFTBORDER;   if(a) P_CONST("|"); }
  292.         if(a & GACT_TOPBORDER)    { P_CONST("GACT_TOPBORDER");    a &= ~GACT_TOPBORDER;    if(a) P_CONST("|"); }
  293.         if(a & GACT_BOTTOMBORDER) { P_CONST("GACT_BOTTOMBORDER"); a &= ~GACT_BOTTOMBORDER; if(a) P_CONST("|"); }
  294.         if(a & GACT_BORDERSNIFF)  { P_CONST("GACT_BORDERSNIFF");  a &= ~GACT_BORDERSNIFF;  if(a) P_CONST("|"); }
  295.         if(a & GACT_TOGGLESELECT) { P_CONST("GACT_TOGGLESELECT"); a &= ~GACT_TOGGLESELECT; if(a) P_CONST("|"); }
  296.         if(a & GACT_BOOLEXTEND)   { P_CONST("GACT_BOOLEXTEND");   a &= ~GACT_BOOLEXTEND;   if(a) P_CONST("|"); }
  297.         if(a & GACT_STRINGLEFT)   { P_CONST("GACT_STRINGLEFT");   a &= ~GACT_STRINGLEFT;   if(a) P_CONST("|"); }
  298.         if(a & GACT_STRINGCENTER) { P_CONST("GACT_STRINGCENTER"); a &= ~GACT_STRINGCENTER; if(a) P_CONST("|"); }
  299.         if(a & GACT_STRINGRIGHT)  { P_CONST("GACT_STRINGRIGHT");  a &= ~GACT_STRINGRIGHT;  if(a) P_CONST("|"); }
  300.         if(a & GACT_LONGINT)      { P_CONST("GACT_LONGINT");      a &= ~GACT_LONGINT;      if(a) P_CONST("|"); }
  301.         if(a & GACT_ALTKEYMAP)    { P_CONST("GACT_ALTKEYMAP");    a &= ~GACT_ALTKEYMAP;    if(a) P_CONST("|"); }
  302.         if(a & GACT_STRINGEXTEND) { P_CONST("GACT_STRINGEXTEND"); a &= ~GACT_STRINGEXTEND; if(a) P_CONST("|"); }
  303.         if(a & GACT_ACTIVEGADGET) { P_CONST("GACT_ACTIVEGADGET"); a &= ~GACT_ACTIVEGADGET; if(a) P_CONST("|"); }
  304.         if(a & GACT_ACTIVEGADGET) { P_CONST("GACT_ACTIVEGADGET"); a &= ~GACT_ACTIVEGADGET; if(a) P_CONST("|"); }
  305.         if(a & GACT_ACTIVEGADGET) { P_CONST("GACT_ACTIVEGADGET"); a &= ~GACT_ACTIVEGADGET; if(a) P_CONST("|"); }
  306.         if(a) P_NUMVAL(a);
  307.       }
  308.       else P_CONST("NULL");
  309.     }
  310.     END_FIELD("Activation");
  311.  
  312.     BEGIN_FIELD;
  313.     {
  314.       UWORD t= g->GadgetType;
  315.  
  316.       if(t)
  317.       {
  318.         if(t & GTYP_GADGETTYPE)   { P_CONST("GTYP_GADGETTYPE");   t &= ~GTYP_GADGETTYPE;   if(t) P_CONST("|"); }
  319.         if(t & GTYP_SYSGADGET)    { P_CONST("GTYP_SYSGADGET");    t &= ~GTYP_SYSGADGET;    if(t) P_CONST("|"); }
  320.         if(t & GTYP_SCRGADGET)    { P_CONST("GTYP_SCRGADGET");    t &= ~GTYP_SCRGADGET;    if(t) P_CONST("|"); }
  321.         if(t & GTYP_GZZGADGET)    { P_CONST("GTYP_GZZGADGET");    t &= ~GTYP_GZZGADGET;    if(t) P_CONST("|"); }
  322.         if(t & GTYP_REQGADGET)    { P_CONST("GTYP_REQGADGET");    t &= ~GTYP_REQGADGET;    if(t) P_CONST("|"); }
  323.         if(t & GTYP_SIZING)       { P_CONST("GTYP_SIZING");       t &= ~GTYP_SIZING;       if(t) P_CONST("|"); }
  324.         if(t & GTYP_WDRAGGING)    { P_CONST("GTYP_WDRAGGING");    t &= ~GTYP_WDRAGGING;    if(t) P_CONST("|"); }
  325.         if(t & GTYP_SDRAGGING)    { P_CONST("GTYP_SDRAGGING");    t &= ~GTYP_SDRAGGING;    if(t) P_CONST("|"); }
  326.         if(t & GTYP_WUPFRONT)     { P_CONST("GTYP_WUPFRONT");     t &= ~GTYP_WUPFRONT;     if(t) P_CONST("|"); }
  327.         if(t & GTYP_SUPFRONT)     { P_CONST("GTYP_SUPFRONT");     t &= ~GTYP_SUPFRONT;     if(t) P_CONST("|"); }
  328.         if(t & GTYP_WDOWNBACK)    { P_CONST("GTYP_WDOWNBACK");    t &= ~GTYP_WDOWNBACK;    if(t) P_CONST("|"); }
  329.         if(t & GTYP_SDOWNBACK)    { P_CONST("GTYP_SDOWNBACK");    t &= ~GTYP_SDOWNBACK;    if(t) P_CONST("|"); }
  330.         if(t & GTYP_CLOSE)        { P_CONST("GTYP_CLOSE");        t &= ~GTYP_CLOSE;        if(t) P_CONST("|"); }
  331.         if(t & GTYP_BOOLGADGET)   { P_CONST("GTYP_BOOLGADGET");   t &= ~GTYP_BOOLGADGET;   if(t) P_CONST("|"); }
  332.         if(t & GTYP_GADGET0002)   { P_CONST("GTYP_GADGET0002");   t &= ~GTYP_GADGET0002;   if(t) P_CONST("|"); }
  333.         if(t & GTYP_PROPGADGET)   { P_CONST("GTYP_PROPGADGET");   t &= ~GTYP_PROPGADGET;   if(t) P_CONST("|"); }
  334.         if(t & GTYP_STRGADGET)    { P_CONST("GTYP_STRGADGET");    t &= ~GTYP_STRGADGET;    if(t) P_CONST("|"); }
  335.         if(t & GTYP_CUSTOMGADGET) { P_CONST("GTYP_CUSTOMGADGET"); t &= ~GTYP_CUSTOMGADGET; if(t) P_CONST("|"); }
  336.         if(t & GTYP_GTYPEMASK)    { P_CONST("GTYP_GTYPEMASK");    t &= ~GTYP_GTYPEMASK;    if(t) P_CONST("|"); }
  337.         if(t) P_NUMVAL(t);
  338.       }
  339.       else P_CONST("NULL");
  340.     }
  341.     END_FIELD("GadgetType");
  342.  
  343.     BEGIN_FIELD;
  344.       if(g->GadgetRender)
  345.         P_CONST("(APTR)&" GADGETRENDER_NAME);
  346.       else
  347.         P_CONST("NULL");
  348.     END_FIELD("GadgetRender");
  349.  
  350.     BEGIN_FIELD;
  351.       if(g->SelectRender)
  352.         P_CONST("(APTR)&" SELECTRENDER_NAME);
  353.       else
  354.         P_CONST("NULL");
  355.     END_FIELD("SelectRender");
  356.  
  357.     BEGIN_FIELD;
  358.       P_CONST("NULL");
  359.       if(g->GadgetText)
  360.         pout(" /* 0x%lx */",g->GadgetText);
  361.     END_FIELD("GadgetText");
  362.  
  363.     BEGIN_FIELD;
  364.       P_NUMVAL(g->MutualExclude);
  365.     END_FIELD("MutualExclude");
  366.  
  367.     BEGIN_FIELD;
  368.       P_CONST("NULL");
  369.       if(g->SpecialInfo)
  370.         pout(" /* 0x%lx */",g->SpecialInfo);
  371.     END_FIELD("SpecialInfo");
  372.  
  373.     BEGIN_FIELD;
  374.       P_NUMVAL(g->GadgetID);
  375.     END_FIELD("GadgetID");
  376.  
  377.     BEGIN_FIELD;
  378.     {
  379.       LONG ud= (LONG)g->UserData;
  380.       LONG dr= ud & WB_DISKREVISIONMASK;
  381.  
  382.       pout("(APTR)");
  383.  
  384.       if(ud != dr)
  385.       {
  386.         P_NUMVAL(ud);
  387.         if(dr) P_CONST("|");
  388.       }
  389.       if(dr == WB_DISKREVISION)
  390.         P_CONST("WB_DISKREVISION");
  391.       else
  392.         P_NUMVAL(dr);
  393.     }
  394.     END_FIELD("UserData");
  395.  
  396.     if(g->Flags & GFLG_EXTENDED)
  397.     {
  398.       struct ExtGadget *eg= (struct ExtGadget *)g;
  399.  
  400.       BEGIN_FIELD;
  401.       {
  402.         ULONG m= eg->MoreFlags;
  403.  
  404.         if(m)
  405.         {
  406.           if(m & GMORE_BOUNDS)       { P_CONST("GMORE_BOUNDS");       m &= ~GMORE_BOUNDS;       if(m) P_CONST("|"); }
  407.           if(m & GMORE_GADGETHELP)   { P_CONST("GMORE_GADGETHELP");   m &= ~GMORE_GADGETHELP;   if(m) P_CONST("|"); }
  408.           if(m & GMORE_SCROLLRASTER) { P_CONST("GMORE_SCROLLRASTER"); m &= ~GMORE_SCROLLRASTER; if(m) P_CONST("|"); }
  409.           if(m) P_NUMVAL(m);
  410.         }
  411.         else P_CONST("NULL");
  412.       }
  413.       END_FIELD("MoreFlags");
  414.  
  415.       BEGIN_FIELD;
  416.         P_NUMVAL(eg->BoundsLeftEdge);
  417.       END_FIELD("BoundsLeftEdge");
  418.  
  419.       BEGIN_FIELD;
  420.         P_NUMVAL(eg->BoundsTopEdge);
  421.       END_FIELD("BoundsTopEdge");
  422.  
  423.       BEGIN_FIELD;
  424.         P_NUMVAL(eg->BoundsWidth);
  425.       END_FIELD("BoundsWidth");
  426.  
  427.       BEGIN_FIELD;
  428.         P_NUMVAL(eg->BoundsHeight);
  429.       END_FIELD("BoundsHeight");
  430.     }
  431.  
  432.   END_STRUCT;
  433.  
  434.   pout("\n#endif /* UNDEFINED */\n");
  435. }
  436.  
  437. #endif /* DEBUG */
  438.  
  439.  
  440. void p_DrawerData(struct DrawerData *dd, char *name)
  441. {
  442.   struct NewWindow *nw= &dd->dd_NewWindow;
  443.  
  444. #ifdef DEBUG
  445.   if(nw->FirstGadget)
  446.     p_Gadget(nw->FirstGadget, "<unknown>");
  447. #endif /* DEBUG */
  448.  
  449.   BEGIN_STRUCT("DrawerData", name);
  450.  
  451.     BEGIN_FIELD;
  452.       P_NUMVAL(nw->LeftEdge);
  453.     END_FIELD("dd_NewWindow.LeftEdge");
  454.  
  455.     BEGIN_FIELD;
  456.       P_NUMVAL(nw->TopEdge);
  457.     END_FIELD("dd_NewWindow.TopEdge");
  458.  
  459.     BEGIN_FIELD;
  460.       P_NUMVAL(nw->Width);
  461.     END_FIELD("dd_NewWindow.Width");
  462.  
  463.     BEGIN_FIELD;
  464.       P_NUMVAL(nw->Height);
  465.     END_FIELD("dd_NewWindow.Height");
  466.  
  467.     BEGIN_FIELD;
  468.       P_NUMVAL(nw->DetailPen);
  469.     END_FIELD("dd_NewWindow.DetailPen");
  470.  
  471.     BEGIN_FIELD;
  472.       P_NUMVAL(nw->BlockPen);
  473.     END_FIELD("dd_NewWindow.BlockPen");
  474.  
  475.     BEGIN_FIELD;
  476.     {
  477.       ULONG f= nw->IDCMPFlags;
  478.  
  479.       if(f)
  480.       {
  481.         if(f & IDCMP_SIZEVERIFY)     { P_CONST("IDCMP_SIZEVERIFY");     f &= ~IDCMP_SIZEVERIFY;     if(f) P_CONST("|"); }
  482.         if(f & IDCMP_NEWSIZE)        { P_CONST("IDCMP_NEWSIZE");        f &= ~IDCMP_NEWSIZE;        if(f) P_CONST("|"); }
  483.         if(f & IDCMP_REFRESHWINDOW)  { P_CONST("IDCMP_REFRESHWINDOW");  f &= ~IDCMP_REFRESHWINDOW;  if(f) P_CONST("|"); }
  484.         if(f & IDCMP_MOUSEBUTTONS)   { P_CONST("IDCMP_MOUSEBUTTONS");   f &= ~IDCMP_MOUSEBUTTONS;   if(f) P_CONST("|"); }
  485.         if(f & IDCMP_MOUSEMOVE)      { P_CONST("IDCMP_MOUSEMOVE");      f &= ~IDCMP_MOUSEMOVE;      if(f) P_CONST("|"); }
  486.         if(f & IDCMP_GADGETDOWN)     { P_CONST("IDCMP_GADGETDOWN");     f &= ~IDCMP_GADGETDOWN;     if(f) P_CONST("|"); }
  487.         if(f & IDCMP_GADGETUP)       { P_CONST("IDCMP_GADGETUP");       f &= ~IDCMP_GADGETUP;       if(f) P_CONST("|"); }
  488.         if(f & IDCMP_REQSET)         { P_CONST("IDCMP_REQSET");         f &= ~IDCMP_REQSET;         if(f) P_CONST("|"); }
  489.         if(f & IDCMP_MENUPICK)       { P_CONST("IDCMP_MENUPICK");       f &= ~IDCMP_MENUPICK;       if(f) P_CONST("|"); }
  490.         if(f & IDCMP_CLOSEWINDOW)    { P_CONST("IDCMP_CLOSEWINDOW");    f &= ~IDCMP_CLOSEWINDOW;    if(f) P_CONST("|"); }
  491.         if(f & IDCMP_RAWKEY)         { P_CONST("IDCMP_RAWKEY");         f &= ~IDCMP_RAWKEY;         if(f) P_CONST("|"); }
  492.         if(f & IDCMP_REQVERIFY)      { P_CONST("IDCMP_REQVERIFY");      f &= ~IDCMP_REQVERIFY;      if(f) P_CONST("|"); }
  493.         if(f & IDCMP_REQCLEAR)       { P_CONST("IDCMP_REQCLEAR");       f &= ~IDCMP_REQCLEAR;       if(f) P_CONST("|"); }
  494.         if(f & IDCMP_MENUVERIFY)     { P_CONST("IDCMP_MENUVERIFY");     f &= ~IDCMP_MENUVERIFY;     if(f) P_CONST("|"); }
  495.         if(f & IDCMP_NEWPREFS)       { P_CONST("IDCMP_NEWPREFS");       f &= ~IDCMP_NEWPREFS;       if(f) P_CONST("|"); }
  496.         if(f & IDCMP_DISKINSERTED)   { P_CONST("IDCMP_DISKINSERTED");   f &= ~IDCMP_DISKINSERTED;   if(f) P_CONST("|"); }
  497.         if(f & IDCMP_DISKREMOVED)    { P_CONST("IDCMP_DISKREMOVED");    f &= ~IDCMP_DISKREMOVED;    if(f) P_CONST("|"); }
  498.         if(f & IDCMP_WBENCHMESSAGE)  { P_CONST("IDCMP_WBENCHMESSAGE");  f &= ~IDCMP_WBENCHMESSAGE;  if(f) P_CONST("|"); }
  499.         if(f & IDCMP_ACTIVEWINDOW)   { P_CONST("IDCMP_ACTIVEWINDOW");   f &= ~IDCMP_ACTIVEWINDOW;   if(f) P_CONST("|"); }
  500.         if(f & IDCMP_INACTIVEWINDOW) { P_CONST("IDCMP_INACTIVEWINDOW"); f &= ~IDCMP_INACTIVEWINDOW; if(f) P_CONST("|"); }
  501.         if(f & IDCMP_DELTAMOVE)      { P_CONST("IDCMP_DELTAMOVE");      f &= ~IDCMP_DELTAMOVE;      if(f) P_CONST("|"); }
  502.         if(f & IDCMP_VANILLAKEY)     { P_CONST("IDCMP_VANILLAKEY");     f &= ~IDCMP_VANILLAKEY;     if(f) P_CONST("|"); }
  503.         if(f & IDCMP_INTUITICKS)     { P_CONST("IDCMP_INTUITICKS");     f &= ~IDCMP_INTUITICKS;     if(f) P_CONST("|"); }
  504.         if(f & IDCMP_IDCMPUPDATE)    { P_CONST("IDCMP_IDCMPUPDATE");    f &= ~IDCMP_IDCMPUPDATE;    if(f) P_CONST("|"); }
  505.         if(f & IDCMP_MENUHELP)       { P_CONST("IDCMP_MENUHELP");       f &= ~IDCMP_MENUHELP;       if(f) P_CONST("|"); }
  506.         if(f & IDCMP_CHANGEWINDOW)   { P_CONST("IDCMP_CHANGEWINDOW");   f &= ~IDCMP_CHANGEWINDOW;   if(f) P_CONST("|"); }
  507.         if(f & IDCMP_GADGETHELP)     { P_CONST("IDCMP_GADGETHELP");     f &= ~IDCMP_GADGETHELP;     if(f) P_CONST("|"); }
  508.         if(f & IDCMP_LONELYMESSAGE)  { P_CONST("IDCMP_LONELYMESSAGE");  f &= ~IDCMP_LONELYMESSAGE;  if(f) P_CONST("|"); }
  509.         if(f) P_NUMVAL(f);
  510.       }
  511.       else P_CONST("NULL");
  512.     }
  513.     END_FIELD("dd_NewWindow.IDCMPFlags");
  514.  
  515.     BEGIN_FIELD;
  516.     {
  517.       ULONG f= nw->Flags;
  518.       if(f)
  519.       {
  520.         if(f & WFLG_SIZEGADGET)     { P_CONST("WFLG_SIZEGADGET");     f &= ~WFLG_SIZEGADGET;     if(f) P_CONST("|"); }
  521.         if(f & WFLG_DRAGBAR)        { P_CONST("WFLG_DRAGBAR");        f &= ~WFLG_DRAGBAR;        if(f) P_CONST("|"); }
  522.         if(f & WFLG_DEPTHGADGET)    { P_CONST("WFLG_DEPTHGADGET");    f &= ~WFLG_DEPTHGADGET;    if(f) P_CONST("|"); }
  523.         if(f & WFLG_CLOSEGADGET)    { P_CONST("WFLG_CLOSEGADGET");    f &= ~WFLG_CLOSEGADGET;    if(f) P_CONST("|"); }
  524.         if(f & WFLG_SIZEBRIGHT)     { P_CONST("WFLG_SIZEBRIGHT");     f &= ~WFLG_SIZEBRIGHT;     if(f) P_CONST("|"); }
  525.         if(f & WFLG_SIZEBBOTTOM)    { P_CONST("WFLG_SIZEBBOTTOM");    f &= ~WFLG_SIZEBBOTTOM;    if(f) P_CONST("|"); }
  526.         /*if(f & WFLG_REFRESHBITS)    { P_CONST("WFLG_REFRESHBITS");    f &= ~WFLG_REFRESHBITS;    if(f) P_CONST("|"); }*/
  527.         if(f & WFLG_SMART_REFRESH)  { P_CONST("WFLG_SMART_REFRESH");  f &= ~WFLG_SMART_REFRESH;  if(f) P_CONST("|"); }
  528.         if(f & WFLG_SIMPLE_REFRESH) { P_CONST("WFLG_SIMPLE_REFRESH"); f &= ~WFLG_SIMPLE_REFRESH; if(f) P_CONST("|"); }
  529.         if(f & WFLG_SUPER_BITMAP)   { P_CONST("WFLG_SUPER_BITMAP");   f &= ~WFLG_SUPER_BITMAP;   if(f) P_CONST("|"); }
  530.         if(f & WFLG_OTHER_REFRESH)  { P_CONST("WFLG_OTHER_REFRESH");  f &= ~WFLG_OTHER_REFRESH;  if(f) P_CONST("|"); }
  531.         if(f & WFLG_BACKDROP)       { P_CONST("WFLG_BACKDROP");       f &= ~WFLG_BACKDROP;       if(f) P_CONST("|"); }
  532.         if(f & WFLG_REPORTMOUSE)    { P_CONST("WFLG_REPORTMOUSE");    f &= ~WFLG_REPORTMOUSE;    if(f) P_CONST("|"); }
  533.         if(f & WFLG_GIMMEZEROZERO)  { P_CONST("WFLG_GIMMEZEROZERO");  f &= ~WFLG_GIMMEZEROZERO;  if(f) P_CONST("|"); }
  534.         if(f & WFLG_BORDERLESS)     { P_CONST("WFLG_BORDERLESS");     f &= ~WFLG_BORDERLESS;     if(f) P_CONST("|"); }
  535.         if(f & WFLG_ACTIVATE)       { P_CONST("WFLG_ACTIVATE");       f &= ~WFLG_ACTIVATE;       if(f) P_CONST("|"); }
  536.         if(f & WFLG_RMBTRAP)        { P_CONST("WFLG_RMBTRAP");        f &= ~WFLG_RMBTRAP;        if(f) P_CONST("|"); }
  537.         if(f & WFLG_NOCAREREFRESH)  { P_CONST("WFLG_NOCAREREFRESH");  f &= ~WFLG_NOCAREREFRESH;  if(f) P_CONST("|"); }
  538.         if(f & WFLG_NW_EXTENDED)    { P_CONST("WFLG_NW_EXTENDED");    f &= ~WFLG_NW_EXTENDED;    if(f) P_CONST("|"); }
  539.         if(f & WFLG_NEWLOOKMENUS)   { P_CONST("WFLG_NEWLOOKMENUS");   f &= ~WFLG_NEWLOOKMENUS;   if(f) P_CONST("|"); }
  540.         if(f & WFLG_WINDOWACTIVE)   { P_CONST("WFLG_WINDOWACTIVE");   f &= ~WFLG_WINDOWACTIVE;   if(f) P_CONST("|"); }
  541.         if(f & WFLG_INREQUEST)      { P_CONST("WFLG_INREQUEST");      f &= ~WFLG_INREQUEST;      if(f) P_CONST("|"); }
  542.         if(f & WFLG_MENUSTATE)      { P_CONST("WFLG_MENUSTATE");      f &= ~WFLG_MENUSTATE;      if(f) P_CONST("|"); }
  543.         if(f & WFLG_WINDOWREFRESH)  { P_CONST("WFLG_WINDOWREFRESH");  f &= ~WFLG_WINDOWREFRESH;  if(f) P_CONST("|"); }
  544.         if(f & WFLG_WBENCHWINDOW)   { P_CONST("WFLG_WBENCHWINDOW");   f &= ~WFLG_WBENCHWINDOW;   if(f) P_CONST("|"); }
  545.         if(f & WFLG_WINDOWTICKED)   { P_CONST("WFLG_WINDOWTICKED");   f &= ~WFLG_WINDOWTICKED;   if(f) P_CONST("|"); }
  546.         if(f & WFLG_VISITOR)        { P_CONST("WFLG_VISITOR");        f &= ~WFLG_VISITOR;        if(f) P_CONST("|"); }
  547.         if(f & WFLG_ZOOMED)         { P_CONST("WFLG_ZOOMED");         f &= ~WFLG_ZOOMED;         if(f) P_CONST("|"); }
  548.         if(f & WFLG_HASZOOM)        { P_CONST("WFLG_HASZOOM");        f &= ~WFLG_HASZOOM;        if(f) P_CONST("|"); }
  549.         if(f) P_NUMVAL(f);
  550.       }
  551.       else P_CONST("NULL");
  552.     }
  553.     END_FIELD("dd_NewWindow.Flags");
  554.  
  555.     BEGIN_FIELD;
  556.       P_CONST("NULL");
  557.       if(nw->FirstGadget)
  558.       {
  559.         pout(" /* 0x%lx */",nw->FirstGadget);
  560.         oops("DrawerData.dd_NewWindow.FirstGadget",nw->FirstGadget);
  561.       }
  562.     END_FIELD("dd_NewWindow.FirstGadget");
  563.  
  564.     BEGIN_FIELD;
  565.       P_CONST("NULL");
  566.       if(nw->CheckMark)
  567.       {
  568.         pout(" /* 0x%lx */",nw->CheckMark);
  569.         oops("DrawerData.dd_NewWindow.CheckMark",nw->CheckMark);
  570.       }
  571.     END_FIELD("dd_NewWindow.CheckMark");
  572.  
  573.     BEGIN_FIELD;
  574.       P_CONST("NULL");
  575.       if(nw->Title)
  576.       {
  577. #ifdef DEBUG
  578.         pout(" /* ");
  579.         p_strN(80,nw->Title);
  580.         pout(" */");
  581. #endif /* DEBUG */
  582.  
  583.         pout(" /* 0x%lx */",nw->Title);
  584.         oops("DrawerData.dd_NewWindow.Title",nw->Title);
  585.       }
  586.     END_FIELD("dd_NewWindow.Title");
  587.  
  588.     BEGIN_FIELD;
  589.       P_CONST("NULL");
  590.       if(nw->Screen)
  591.       {
  592.         pout(" /* 0x%lx */",nw->Screen);
  593.         oops("DrawerData.dd_NewWindow.Screen",nw->Screen);
  594.       }
  595.     END_FIELD("dd_NewWindow.Screen");
  596.  
  597.     BEGIN_FIELD;
  598.       P_CONST("NULL");
  599.       if(nw->BitMap)
  600.       {
  601.         pout(" /* 0x%lx */",nw->BitMap);
  602.         oops("DrawerData.dd_NewWindow.BitMap",nw->BitMap);
  603.       }
  604.     END_FIELD("dd_NewWindow.BitMap");
  605.  
  606.     BEGIN_FIELD;
  607.       P_NUMVAL(nw->MinWidth);
  608.     END_FIELD("dd_NewWindow.MinWidth");
  609.  
  610.     BEGIN_FIELD;
  611.       P_NUMVAL(nw->MinHeight);
  612.     END_FIELD("dd_NewWindow.MinHeight");
  613.  
  614.     BEGIN_FIELD;
  615.       P_NUMVAL(nw->MaxWidth);
  616.     END_FIELD("dd_NewWindow.MaxWidth");
  617.  
  618.     BEGIN_FIELD;
  619.       P_NUMVAL(nw->MinWidth);
  620.     END_FIELD("dd_NewWindow.MaxHeight");
  621.  
  622.     BEGIN_FIELD;
  623.     {
  624.       UWORD t= nw->Type;
  625.  
  626.       if(t)
  627.       {
  628.         if(t & WBENCHSCREEN) { P_CONST("WBENCHSCREEN"); t &= ~WBENCHSCREEN; if(t) P_CONST("|"); }
  629.         if(t & PUBLICSCREEN) { P_CONST("PUBLICSCREEN"); t &= ~PUBLICSCREEN; if(t) P_CONST("|"); }
  630.         if(t & CUSTOMSCREEN) { P_CONST("CUSTOMSCREEN"); t &= ~CUSTOMSCREEN; if(t) P_CONST("|"); }
  631.         if(t & SHOWTITLE)    { P_CONST("SHOWTITLE");    t &= ~SHOWTITLE;    if(t) P_CONST("|"); }
  632.         if(t & BEEPING)      { P_CONST("BEEPING");      t &= ~BEEPING;      if(t) P_CONST("|"); }
  633.         if(t & CUSTOMBITMAP) { P_CONST("CUSTOMBITMAP"); t &= ~CUSTOMBITMAP; if(t) P_CONST("|"); }
  634.         if(t & SCREENBEHIND) { P_CONST("SCREENBEHIND"); t &= ~SCREENBEHIND; if(t) P_CONST("|"); }
  635.         if(t & SCREENQUIET)  { P_CONST("SCREENQUIET");  t &= ~SCREENQUIET;  if(t) P_CONST("|"); }
  636.         if(t & SCREENHIRES)  { P_CONST("SCREENHIRES");  t &= ~SCREENHIRES;  if(t) P_CONST("|"); }
  637.         if(t & NS_EXTENDED)  { P_CONST("NS_EXTENDED");  t &= ~NS_EXTENDED;  if(t) P_CONST("|"); }
  638.         if(t & AUTOSCROLL)   { P_CONST("AUTOSCROLL");   t &= ~AUTOSCROLL;   if(t) P_CONST("|"); }
  639.         if(t & PENSHARED)    { P_CONST("PENSHARED");    t &= ~PENSHARED;    if(t) P_CONST("|"); }
  640.         if(t) P_NUMVAL(t);
  641.       }
  642.       else P_CONST("NULL");
  643.     }
  644.     END_FIELD("dd_NewWindow.Type");
  645.  
  646.     /**/
  647.  
  648.     BEGIN_FIELD;
  649.       if(dd->dd_CurrentX == NO_ICON_POSITION)
  650.         P_CONST("NO_ICON_POSITION");
  651.       else
  652.         P_NUMVAL(dd->dd_CurrentX);
  653.     END_FIELD("dd_CurrentX");
  654.  
  655.     BEGIN_FIELD;
  656.       if(dd->dd_CurrentY == NO_ICON_POSITION)
  657.         P_CONST("NO_ICON_POSITION");
  658.       else
  659.         P_NUMVAL(dd->dd_CurrentY);
  660.     END_FIELD("dd_CurrentY");
  661.  
  662.     BEGIN_FIELD;
  663.       P_NUMVAL(dd->dd_Flags);
  664.     END_FIELD("dd_Flags");
  665.  
  666.     BEGIN_FIELD;
  667.       P_NUMVAL(dd->dd_ViewModes);
  668.     END_FIELD("dd_ViewModes");
  669.  
  670.   END_STRUCT;
  671.  
  672. };
  673.  
  674.  
  675. void p_ImageData(struct Image *i, char *name)
  676. {
  677.   WORD w,h,d;
  678.   UWORD *p= i->ImageData;
  679.  
  680.   pout("\nUWORD %s_data[] = {\n",name);
  681.  
  682.   for(d=0; d<i->Depth; d++)
  683.   {
  684.     if(i->PlanePick & (1L << d))
  685.     {
  686.       pout("\n\t/* plane %d */\n\n",d);
  687.  
  688.       for(h=0; h<i->Height; h++)
  689.       {
  690.         pout("\t");
  691.         for(w=0; w< (i->Width + 15)/16; w++)
  692.         {
  693.           pout("0x%04x, ", (UWORD)(*p));
  694.           ++p;
  695.         }
  696.         pout("\n");
  697.       }
  698.     }
  699.     else pout("\n\t/* plane %d is set to %d by %s.PlaneOnOff */\n\n",d,
  700.       ( (i->PlaneOnOff & (1L<<d)) >> d ),name);
  701.   }
  702.   pout("};\n");
  703. }
  704.  
  705.  
  706. void p_Image(struct Image *i, char *name)
  707. {
  708.   if(i->ImageData)
  709.     p_ImageData(i,name);
  710.  
  711.   BEGIN_STRUCT("Image", name);
  712.  
  713.     BEGIN_FIELD;
  714.       P_NUMVAL(i->LeftEdge);
  715.     END_FIELD("LeftEdge");
  716.  
  717.     BEGIN_FIELD;
  718.       P_NUMVAL(i->TopEdge);
  719.     END_FIELD("TopEdge");
  720.  
  721.     BEGIN_FIELD;
  722.       P_NUMVAL(i->Width);
  723.     END_FIELD("Width");
  724.  
  725.     BEGIN_FIELD;
  726.       P_NUMVAL(i->Height);
  727.     END_FIELD("Height");
  728.  
  729.     BEGIN_FIELD;
  730.       P_NUMVAL(i->Depth);
  731.     END_FIELD("Depth");
  732.  
  733.     BEGIN_FIELD;
  734.       if(i->ImageData)
  735.         pout("%s_data",name);
  736.       else
  737.         P_CONST("NULL");
  738.     END_FIELD("ImageData");
  739.  
  740.     BEGIN_FIELD;
  741.       P_NUMVAL(i->PlanePick);
  742.       if( i->PlanePick & ~((1L << i->Depth) -1L) )
  743.       {
  744.         pout(" /* illegal */");
  745.         warn("illegal value %d for Image.PlanePick (depth=%d)",i->PlanePick,i->Depth);
  746.       }
  747.     END_FIELD("PlanePick");
  748.  
  749.     BEGIN_FIELD;
  750.       P_NUMVAL(i->PlaneOnOff);
  751.     END_FIELD("PlaneOnOff");
  752.  
  753.     BEGIN_FIELD;
  754.       P_CONST("NULL");
  755.       if(i->NextImage)
  756.       {
  757.         pout(" /* 0x%lx */", i->NextImage);
  758.         oops("Image.NextImage",i->NextImage);
  759.       }
  760.     END_FIELD("NextImage");
  761.  
  762.   END_STRUCT;
  763. }
  764.  
  765.  
  766. void p_ToolTypes(char **tt, char *name)
  767. {
  768.  
  769.   pout("\nchar *%s[] = %s", name, tt ? "{\n" : "(char **)NULL");
  770.  
  771.   if(tt)
  772.   {
  773.     while(*tt)
  774.     {
  775.       pout("\t\"%s\",\n",*tt++);
  776.     }
  777.     pout("\tNULL\n}");
  778.   }
  779.   pout(";\n");
  780. }
  781.  
  782.  
  783. void p_DiskObject(struct DiskObject *icon, char *name)
  784. {
  785.   BEGIN_STRUCT("DiskObject", name);
  786.  
  787.     BEGIN_FIELD;
  788.       if(icon->do_Magic == WB_DISKMAGIC)
  789.         P_CONST("WB_DISKMAGIC");
  790.       else
  791.         P_NUMVAL(icon->do_Magic);
  792.     END_FIELD("do_Magic");
  793.  
  794.     BEGIN_FIELD;
  795.       if(icon->do_Version == WB_DISKVERSION)
  796.         P_CONST("WB_DISKVERSION");
  797.       else
  798.         P_NUMVAL(WB_DISKVERSION);
  799.     END_FIELD("do_Version");
  800.  
  801.     /* do_Gadget */
  802.     {
  803.       struct Gadget *g= &icon->do_Gadget;
  804.  
  805.       BEGIN_FIELD;
  806.         P_CONST("NULL");
  807.         if(g->NextGadget)
  808.         {
  809.           pout(" /* 0x%lx */",g->NextGadget);
  810.           oops("DiskObject.do_Gadget.NextGadget",g->NextGadget);
  811.         }
  812.       END_FIELD("do_Gadget.NextGadget");
  813.  
  814.       BEGIN_FIELD;
  815.         P_NUMVAL(g->LeftEdge);
  816.       END_FIELD("do_Gadget.LeftEdge");
  817.  
  818.       BEGIN_FIELD;
  819.         P_NUMVAL(g->TopEdge);
  820.       END_FIELD("do_Gadget.TopEdge");
  821.  
  822.       BEGIN_FIELD;
  823.         P_NUMVAL(g->Width);
  824.       END_FIELD("do_Gadget.Width");
  825.  
  826.       BEGIN_FIELD;
  827.         P_NUMVAL(g->Height);
  828.       END_FIELD("do_Gadget.Height");
  829.  
  830.       BEGIN_FIELD;
  831.       {
  832.         UWORD f= g->Flags;
  833.  
  834.         if(f)
  835.         {
  836.           /* <workbench/workbench.h> */
  837.           if(f & GADGBACKFILL)      { P_CONST("GADGBACKFILL");      f &= ~GADGBACKFILL;      if(f) P_CONST("|"); }
  838.           /* <intuition/intuition.h> */
  839.           /*if(f & GFLG_GADGHIGHBITS) { P_CONST("GFLG_GADGHIGHBITS"); f &= ~GFLG_GADGHIGHBITS; if(f) P_CONST("|"); }*/
  840.           if(f & GFLG_GADGHCOMP)    { P_CONST("GFLG_GADGHCOMP");    f &= ~GFLG_GADGHCOMP;    if(f) P_CONST("|"); }
  841.           if(f & GFLG_GADGHBOX)     { P_CONST("GFLG_GADGHBOX");     f &= ~GFLG_GADGHBOX;     if(f) P_CONST("|"); }
  842.           if(f & GFLG_GADGHIMAGE)   { P_CONST("GFLG_GADGHIMAGE");   f &= ~GFLG_GADGHIMAGE;   if(f) P_CONST("|"); }
  843.           if(f & GFLG_GADGHNONE)    { P_CONST("GFLG_GADGHNONE");    f &= ~GFLG_GADGHNONE;    if(f) P_CONST("|"); }
  844.           if(f & GFLG_GADGIMAGE)    { P_CONST("GFLG_GADGIMAGE");    f &= ~GFLG_GADGIMAGE;    if(f) P_CONST("|"); }
  845.           if(f & GFLG_RELBOTTOM)    { P_CONST("GFLG_RELBOTTOM");    f &= ~GFLG_RELBOTTOM;    if(f) P_CONST("|"); }
  846.           if(f & GFLG_RELRIGHT)     { P_CONST("GFLG_RELRIGHT");     f &= ~GFLG_RELRIGHT;     if(f) P_CONST("|"); }
  847.           if(f & GFLG_RELWIDTH)     { P_CONST("GFLG_RELWIDTH");     f &= ~GFLG_RELWIDTH;     if(f) P_CONST("|"); }
  848.           if(f & GFLG_RELHEIGHT)    { P_CONST("GFLG_RELHEIGHT");    f &= ~GFLG_RELHEIGHT;    if(f) P_CONST("|"); }
  849.           if(f & GFLG_RELSPECIAL)   { P_CONST("GFLG_RELSPECIAL");   f &= ~GFLG_RELSPECIAL;   if(f) P_CONST("|"); }
  850.           if(f & GFLG_SELECTED)     { P_CONST("GFLG_SELECTED");     f &= ~GFLG_SELECTED;     if(f) P_CONST("|"); }
  851.           if(f & GFLG_DISABLED)     { P_CONST("GFLG_DISABLED");     f &= ~GFLG_DISABLED;     if(f) P_CONST("|"); }
  852.           if(f & GFLG_LABELMASK)    { P_CONST("GFLG_LABELMASK");    f &= ~GFLG_LABELMASK;    if(f) P_CONST("|"); }
  853.           if(f & GFLG_LABELITEXT)   { P_CONST("GFLG_LABELITEXT");   f &= ~GFLG_LABELITEXT;   if(f) P_CONST("|"); }
  854.           if(f & GFLG_LABELSTRING)  { P_CONST("GFLG_LABELSTRING");  f &= ~GFLG_LABELSTRING;  if(f) P_CONST("|"); }
  855.           if(f & GFLG_LABELIMAGE)   { P_CONST("GFLG_LABELIMAGE");   f &= ~GFLG_LABELIMAGE;   if(f) P_CONST("|"); }
  856.           if(f & GFLG_TABCYCLE)     { P_CONST("GFLG_TABCYCLE");     f &= ~GFLG_TABCYCLE;     if(f) P_CONST("|"); }
  857.           if(f & GFLG_STRINGEXTEND) { P_CONST("GFLG_STRINGEXTEND"); f &= ~GFLG_STRINGEXTEND; if(f) P_CONST("|"); }
  858.           if(f & GFLG_IMAGEDISABLE) { P_CONST("GFLG_IMAGEDISABLE"); f &= ~GFLG_IMAGEDISABLE; if(f) P_CONST("|"); }
  859.           if(f & GFLG_EXTENDED)     { P_CONST("GFLG_EXTENDED");     f &= ~GFLG_EXTENDED;     if(f) P_CONST("|"); }
  860.           if(f) P_NUMVAL(f);
  861.         }
  862.         else P_CONST("NULL");
  863.       }
  864.       END_FIELD("do_Gadget.Flags");
  865.  
  866.       BEGIN_FIELD;
  867.       {
  868.         UWORD a= g->Activation;
  869.  
  870.         if(a)
  871.         {
  872.           if(a & GFLG_LABELITEXT)   { P_CONST("GFLG_LABELITEXT");   a &= ~GFLG_LABELITEXT;   if(a) P_CONST("|"); }
  873.           if(a & GACT_RELVERIFY)    { P_CONST("GACT_RELVERIFY");    a &= ~GACT_RELVERIFY;    if(a) P_CONST("|"); }
  874.           if(a & GACT_IMMEDIATE)    { P_CONST("GACT_IMMEDIATE");    a &= ~GACT_IMMEDIATE;    if(a) P_CONST("|"); }
  875.           if(a & GACT_ENDGADGET)    { P_CONST("GACT_ENDGADGET");    a &= ~GACT_ENDGADGET;    if(a) P_CONST("|"); }
  876.           if(a & GACT_FOLLOWMOUSE)  { P_CONST("GACT_FOLLOWMOUSE");  a &= ~GACT_FOLLOWMOUSE;  if(a) P_CONST("|"); }
  877.           if(a & GACT_RIGHTBORDER)  { P_CONST("GACT_RIGHTBORDER");  a &= ~GACT_RIGHTBORDER;  if(a) P_CONST("|"); }
  878.           if(a & GACT_LEFTBORDER)   { P_CONST("GACT_LEFTBORDER");   a &= ~GACT_LEFTBORDER;   if(a) P_CONST("|"); }
  879.           if(a & GACT_TOPBORDER)    { P_CONST("GACT_TOPBORDER");    a &= ~GACT_TOPBORDER;    if(a) P_CONST("|"); }
  880.           if(a & GACT_BOTTOMBORDER) { P_CONST("GACT_BOTTOMBORDER"); a &= ~GACT_BOTTOMBORDER; if(a) P_CONST("|"); }
  881.           if(a & GACT_BORDERSNIFF)  { P_CONST("GACT_BORDERSNIFF");  a &= ~GACT_BORDERSNIFF;  if(a) P_CONST("|"); }
  882.           if(a & GACT_TOGGLESELECT) { P_CONST("GACT_TOGGLESELECT"); a &= ~GACT_TOGGLESELECT; if(a) P_CONST("|"); }
  883.           if(a & GACT_BOOLEXTEND)   { P_CONST("GACT_BOOLEXTEND");   a &= ~GACT_BOOLEXTEND;   if(a) P_CONST("|"); }
  884.           if(a & GACT_STRINGLEFT)   { P_CONST("GACT_STRINGLEFT");   a &= ~GACT_STRINGLEFT;   if(a) P_CONST("|"); }
  885.           if(a & GACT_STRINGCENTER) { P_CONST("GACT_STRINGCENTER"); a &= ~GACT_STRINGCENTER; if(a) P_CONST("|"); }
  886.           if(a & GACT_STRINGRIGHT)  { P_CONST("GACT_STRINGRIGHT");  a &= ~GACT_STRINGRIGHT;  if(a) P_CONST("|"); }
  887.           if(a & GACT_LONGINT)      { P_CONST("GACT_LONGINT");      a &= ~GACT_LONGINT;      if(a) P_CONST("|"); }
  888.           if(a & GACT_ALTKEYMAP)    { P_CONST("GACT_ALTKEYMAP");    a &= ~GACT_ALTKEYMAP;    if(a) P_CONST("|"); }
  889.           if(a & GACT_STRINGEXTEND) { P_CONST("GACT_STRINGEXTEND"); a &= ~GACT_STRINGEXTEND; if(a) P_CONST("|"); }
  890.           if(a & GACT_ACTIVEGADGET) { P_CONST("GACT_ACTIVEGADGET"); a &= ~GACT_ACTIVEGADGET; if(a) P_CONST("|"); }
  891.           if(a & GACT_ACTIVEGADGET) { P_CONST("GACT_ACTIVEGADGET"); a &= ~GACT_ACTIVEGADGET; if(a) P_CONST("|"); }
  892.           if(a & GACT_ACTIVEGADGET) { P_CONST("GACT_ACTIVEGADGET"); a &= ~GACT_ACTIVEGADGET; if(a) P_CONST("|"); }
  893.           if(a) P_NUMVAL(a);
  894.         }
  895.         else P_CONST("NULL");
  896.       }
  897.       END_FIELD("do_Gadget.Activation");
  898.  
  899.       BEGIN_FIELD;
  900.       {
  901.         UWORD t= g->GadgetType;
  902.  
  903.         if(t)
  904.         {
  905.           if(t & GTYP_GADGETTYPE)   { P_CONST("GTYP_GADGETTYPE");   t &= ~GTYP_GADGETTYPE;   if(t) P_CONST("|"); }
  906.           if(t & GTYP_SYSGADGET)    { P_CONST("GTYP_SYSGADGET");    t &= ~GTYP_SYSGADGET;    if(t) P_CONST("|"); }
  907.           if(t & GTYP_SCRGADGET)    { P_CONST("GTYP_SCRGADGET");    t &= ~GTYP_SCRGADGET;    if(t) P_CONST("|"); }
  908.           if(t & GTYP_GZZGADGET)    { P_CONST("GTYP_GZZGADGET");    t &= ~GTYP_GZZGADGET;    if(t) P_CONST("|"); }
  909.           if(t & GTYP_REQGADGET)    { P_CONST("GTYP_REQGADGET");    t &= ~GTYP_REQGADGET;    if(t) P_CONST("|"); }
  910.           if(t & GTYP_SIZING)       { P_CONST("GTYP_SIZING");       t &= ~GTYP_SIZING;       if(t) P_CONST("|"); }
  911.           if(t & GTYP_WDRAGGING)    { P_CONST("GTYP_WDRAGGING");    t &= ~GTYP_WDRAGGING;    if(t) P_CONST("|"); }
  912.           if(t & GTYP_SDRAGGING)    { P_CONST("GTYP_SDRAGGING");    t &= ~GTYP_SDRAGGING;    if(t) P_CONST("|"); }
  913.           if(t & GTYP_WUPFRONT)     { P_CONST("GTYP_WUPFRONT");     t &= ~GTYP_WUPFRONT;     if(t) P_CONST("|"); }
  914.           if(t & GTYP_SUPFRONT)     { P_CONST("GTYP_SUPFRONT");     t &= ~GTYP_SUPFRONT;     if(t) P_CONST("|"); }
  915.           if(t & GTYP_WDOWNBACK)    { P_CONST("GTYP_WDOWNBACK");    t &= ~GTYP_WDOWNBACK;    if(t) P_CONST("|"); }
  916.           if(t & GTYP_SDOWNBACK)    { P_CONST("GTYP_SDOWNBACK");    t &= ~GTYP_SDOWNBACK;    if(t) P_CONST("|"); }
  917.           if(t & GTYP_CLOSE)        { P_CONST("GTYP_CLOSE");        t &= ~GTYP_CLOSE;        if(t) P_CONST("|"); }
  918.           if(t & GTYP_BOOLGADGET)   { P_CONST("GTYP_BOOLGADGET");   t &= ~GTYP_BOOLGADGET;   if(t) P_CONST("|"); }
  919.           if(t & GTYP_GADGET0002)   { P_CONST("GTYP_GADGET0002");   t &= ~GTYP_GADGET0002;   if(t) P_CONST("|"); }
  920.           if(t & GTYP_PROPGADGET)   { P_CONST("GTYP_PROPGADGET");   t &= ~GTYP_PROPGADGET;   if(t) P_CONST("|"); }
  921.           if(t & GTYP_STRGADGET)    { P_CONST("GTYP_STRGADGET");    t &= ~GTYP_STRGADGET;    if(t) P_CONST("|"); }
  922.           if(t & GTYP_CUSTOMGADGET) { P_CONST("GTYP_CUSTOMGADGET"); t &= ~GTYP_CUSTOMGADGET; if(t) P_CONST("|"); }
  923.           if(t & GTYP_GTYPEMASK)    { P_CONST("GTYP_GTYPEMASK");    t &= ~GTYP_GTYPEMASK;    if(t) P_CONST("|"); }
  924.           if(t) P_NUMVAL(t);
  925.         }
  926.         else P_CONST("NULL");
  927.       }
  928.       END_FIELD("do_Gadget.GadgetType");
  929.  
  930.       BEGIN_FIELD;
  931.         if(g->GadgetRender)
  932.           P_CONST("(APTR)&" GADGETRENDER_NAME);
  933.         else
  934.           P_CONST("NULL");
  935.       END_FIELD("do_Gadget.GadgetRender");
  936.  
  937.       BEGIN_FIELD;
  938.         if(g->SelectRender)
  939.           P_CONST("(APTR)&" SELECTRENDER_NAME);
  940.         else
  941.           P_CONST("NULL");
  942.       END_FIELD("do_Gadget.SelectRender");
  943.  
  944.       BEGIN_FIELD;
  945.         P_CONST("NULL");
  946.         if(g->GadgetText)
  947.         {
  948.           pout(" /* 0x%lx */",g->GadgetText);
  949.           oops("DiskObject.do_Gadget.GadgetText",g->GadgetText);
  950.         }
  951.       END_FIELD("do_Gadget.GadgetText");
  952.  
  953.       BEGIN_FIELD;
  954.         P_NUMVAL(g->MutualExclude);
  955.       END_FIELD("do_Gadget.MutualExclude");
  956.  
  957.       BEGIN_FIELD;
  958.         P_CONST("NULL");
  959.         if(g->SpecialInfo)
  960.         {
  961.           pout(" /* 0x%lx */",g->SpecialInfo);
  962.           oops("DiskObject.do_Gadget.SpecialInfo",g->SpecialInfo);
  963.         }
  964.       END_FIELD("do_Gadget.SpecialInfo");
  965.  
  966.       BEGIN_FIELD;
  967.         P_NUMVAL(g->GadgetID);
  968.       END_FIELD("do_Gadget.GadgetID");
  969.  
  970.       BEGIN_FIELD;
  971.       {
  972.         LONG ud= (LONG)g->UserData;
  973.         LONG dr= ud & WB_DISKREVISIONMASK;
  974.  
  975.         pout("(APTR)");
  976.  
  977.         if(ud != dr)
  978.         {
  979.           P_NUMVAL(ud);
  980.           if(dr) P_CONST("|");
  981.         }
  982.         if(dr == WB_DISKREVISION)
  983.           P_CONST("WB_DISKREVISION");
  984.         else
  985.           P_NUMVAL(dr);
  986.       }
  987.       END_FIELD("do_Gadget.UserData");
  988.     }
  989.  
  990.     BEGIN_FIELD;
  991.       switch(icon->do_Type)
  992.       {
  993.         case WBDISK:     P_CONST("WBDISK");       break;
  994.         case WBDRAWER:   P_CONST("WBDRAWER");     break;
  995.         case WBTOOL:     P_CONST("WBTOOL");       break;
  996.         case WBPROJECT:  P_CONST("WBPROJECT");    break;
  997.         case WBGARBAGE:  P_CONST("WBGARBAGE");    break;
  998.         case WBDEVICE:   P_CONST("WBDEVICE");     break;
  999.         case WBKICK:     P_CONST("WBKICK");       break;
  1000.         case WBAPPICON:  P_CONST("WBAPPICON");    break;
  1001.         default:         P_NUMVAL(icon->do_Type); break;
  1002.       }
  1003.     END_FIELD("do_Type");
  1004.  
  1005.     BEGIN_FIELD;
  1006.       P_STRVAL(icon->do_DefaultTool);
  1007.     END_FIELD("do_DefaultTool");
  1008.  
  1009.     BEGIN_FIELD;
  1010.       if(icon->do_ToolTypes)
  1011.         P_CONST("&" TTARRAY_NAME "[0]");
  1012.       else
  1013.         P_CONST("NULL");
  1014.     END_FIELD("do_ToolTypes");
  1015.  
  1016.     BEGIN_FIELD;
  1017.       if(icon->do_CurrentX == NO_ICON_POSITION)
  1018.         P_CONST("NO_ICON_POSITION");
  1019.       else
  1020.         P_NUMVAL(icon->do_CurrentX);
  1021.     END_FIELD("do_CurrentX");
  1022.  
  1023.     BEGIN_FIELD;
  1024.       if(icon->do_CurrentY == NO_ICON_POSITION)
  1025.         P_CONST("NO_ICON_POSITION");
  1026.       else
  1027.         P_NUMVAL(icon->do_CurrentY);
  1028.     END_FIELD("do_CurrentY");
  1029.  
  1030.     BEGIN_FIELD;
  1031.       if(icon->do_DrawerData)
  1032.         P_CONST("&" DRAWERDATA_NAME);
  1033.       else
  1034.         P_CONST("NULL");
  1035.     END_FIELD("do_DrawerData");
  1036.  
  1037.     BEGIN_FIELD;
  1038.       P_STRVAL(icon->do_ToolWindow);
  1039.     END_FIELD("do_ToolWindow");
  1040.  
  1041.     BEGIN_FIELD;
  1042.       P_NUMVAL(icon->do_StackSize);
  1043.     END_FIELD("do_StackSize");
  1044.  
  1045.   END_STRUCT;
  1046. }
  1047.  
  1048.  
  1049. /*** MAIN ***/
  1050.  
  1051.  
  1052. int main(int argc, char **argv)
  1053. {
  1054.   struct RDArgs *a;
  1055.   LONG args[3] = { 0,0,0 };  /* args array */
  1056.   int rc= RETURN_OK;
  1057.  
  1058.   whoami= *argv;
  1059.   fout= stdout;
  1060.  
  1061.   if( a= ReadArgs("NAME/A,QUIET/S,TO/K", args, NULL) )
  1062.   {
  1063.     if( iname= (char *)malloc(strlen((char *)args[0])+1) )
  1064.     {
  1065.       strcpy(iname, (char *)args[0]); /* now we may use warn() */
  1066.  
  1067.       if( IconBase= (struct IconBase *)OpenLibrary(ICONNAME,36L) )
  1068.       {
  1069.         struct DiskObject *icon= GetDiskObject(iname);
  1070.  
  1071.         if(!icon)
  1072.         {
  1073.           int x= strlen(iname) - 5;
  1074.           if(x>0 && !stricmp(&(iname[x]),".info"))
  1075.           {
  1076.             iname[x]= '\0';
  1077.             icon= GetDiskObject(iname);
  1078.           }
  1079.         }
  1080.  
  1081.         if(icon)
  1082.         {
  1083.           if(args[2])
  1084.           {
  1085.             fout= fopen((char *)args[2],"w");
  1086.  
  1087.             if(!fout)
  1088.             {
  1089.               PrintFault(rc= IoErr(), (STRPTR)args[2]);
  1090.               fprintf(stderr,"%s: Unable to open output file.\n",whoami);
  1091.             }
  1092.           }
  1093.  
  1094.           if(fout)
  1095.           {
  1096.             quiet= args[1]; /* now warn() might be a no-op */
  1097.  
  1098.             BEGIN_CODE(iname);
  1099.             {
  1100.               struct Gadget *g= &icon->do_Gadget;
  1101.  
  1102.               if(g->Flags & GFLG_GADGIMAGE)
  1103.               {
  1104.                 if(g->GadgetRender)
  1105.                   p_Image(g->GadgetRender, GADGETRENDER_NAME);
  1106.  
  1107.                 if(g->SelectRender)
  1108.                 {
  1109.                   if(g->Flags & GFLG_GADGHIMAGE == 0)
  1110.                     warn("warning: no GFLG_GADGHIMAGE for SelectRender image");
  1111.  
  1112.                   p_Image(g->SelectRender, SELECTRENDER_NAME);
  1113.                 }
  1114.                 else if(g->Flags & GFLG_GADGHIMAGE)
  1115.                   warn("warning: No SelectRender image for GFLG_GADGHIMAGE");
  1116.               }
  1117.               else warn("warning: unset GFLG_GADGIMAGE in DiskObject.do_Gadget.Flags");
  1118.  
  1119.               if(icon->do_ToolTypes)
  1120.                 p_ToolTypes(icon->do_ToolTypes, TTARRAY_NAME);
  1121.  
  1122.               if(icon->do_DrawerData)
  1123.                 p_DrawerData(icon->do_DrawerData, DRAWERDATA_NAME);
  1124.  
  1125.               p_DiskObject(icon, DISKOBJECT_NAME);
  1126.             }
  1127.             END_CODE;
  1128.  
  1129.             if(fout != stdout)
  1130.               fclose(fout);
  1131.           }
  1132.  
  1133.           FreeDiskObject(icon);
  1134.         }
  1135.         else /* !icon */
  1136.         {
  1137.           rc= IoErr();
  1138.           warn("GetDiskObject() failed");
  1139.         }
  1140.         CloseLibrary((struct Library *)IconBase);
  1141.       }
  1142.       else /* !IconBase */
  1143.       {
  1144.         warn("You need %s V36+",ICONNAME);
  1145.         rc= RETURN_ERROR;
  1146.       }
  1147.       free(iname);
  1148.     }
  1149.     else /* !iname -> don't use warn() */
  1150.     {
  1151.       fprintf(stderr,"%s: no memory!\n", argv[0]);
  1152.       rc= ERROR_NO_FREE_STORE;
  1153.     }
  1154.     FreeArgs(a);
  1155.   }
  1156.   else /* !ReadArgs() */
  1157.   {
  1158.     if(argc == 1)
  1159.       display_version_information();
  1160.  
  1161.     if(argc <= 3)
  1162.       printf("%s: required argument missing\n",whoami);
  1163.     else
  1164.       printf("%s: wrong number of arguments\n",whoami);
  1165.  
  1166.     rc= RETURN_FAIL;
  1167.   }
  1168.  
  1169.   exit(rc);
  1170. }
  1171.